import type { RouteRecordRaw } from "vue-router"

// 加载本地的路由
export function loadLocalRoutes() {
  // 2. 动态获取所有的路由对象
  //    - 路由对象都在独立的文件中
  //    - 从文件中将所有的路由对象信息读取到数组中
  const localRoutes: RouteRecordRaw[] = []
  // 1.1 读取router/main中所有的ts文件
  // webpack中是require.context()，vite中是import
  const files: Record<string, any> = import.meta.glob("../router/main/**/*.ts", {
    eager: true
  })
  // console.log(files)
  for (const key in files) {
    const module = files[key]
    // console.log(module.default)
    localRoutes.push(module.default)
  }
  // ---- console.log("所有路由对象", localRoutes)

  return localRoutes
}

/**
 * 根据菜单映射出按钮权限的数组
 * @param 所有的菜单
 */
export function mapMenuListToPermissions(userMenus: any[]) {
  const permissions: string[] = []

  function recurseGetPermission(menus: any[]) {
    // 这个传入一个空数组表示什么没有做，传入null/undefined会报错
    for (const item of menus) {
      if (item.type === 3) {
        permissions.push(item.permission)
      } else {
        // 如果children为null给一个空数组
        recurseGetPermission(item.children ?? [])
      }
    }
  }

  recurseGetPermission(userMenus)

  return permissions
}

// 第一个被匹配的菜单,全局导出出去
export let firstMenu: any = null
export function mapMenusToRoutes(userMenus: any[]) {
  // 1. 获取菜单（userMenus）
  // ---- console.log("菜单", userMenus)

  // 2. 动态获取所有的路由对象
  const localRoutes = loadLocalRoutes()

  // 3. 根据菜单去匹配正确的路由
  //    - `router.addRoute("main", XXX)`
  const routes: RouteRecordRaw[] = []

  for (const menu of userMenus) {
    for (const submenu of menu.children) {
      const route = localRoutes.find((item) => item.path === submenu.url)
      if (route) {
        routes.push(route)
      }
      // 记录第一个被匹配的菜单
      if (!firstMenu && route) firstMenu = submenu
    }
  }
  return routes
}

/**
 * 根据路径去匹配需要显示的菜单
 * @param path 需要匹配的路径
 * @param userMenus 所有的菜单
 * 返回当前的菜单
 */
export function mapPathToMenu(path: string, userMenus: any[]) {
  // for (const menu of userMenus) {
  //   for (const submenu of menu.children) {
  //     if (submenu.url === path) {
  //       return submenu
  //     }
  //   }
  // }

  let currentMenu: any = {}

  function recurseGetMenu(userMenus: any[]) {
    for (const item of userMenus) {
      if (path.startsWith(item.url)) {
        if (item.url === path && !item.children) {
          currentMenu = item
        } else {
          recurseGetMenu(item.children)
        }
      }
    }
  }
  recurseGetMenu(userMenus)

  return currentMenu
}

/**
 * 根据路径匹配面包屑
 * @param path 匹配的路径
 * @param userMenus 所有的菜单
 * @returns
 */
interface IBreadcrumbs {
  name: string
  path?: string
}
export function mapPathToBreadcrumbs(path: string, userMenus: any[]) {
  // 1.定义面包屑
  const breadcrumbs: IBreadcrumbs[] = []

  // 2.获取面包屑的层级
  function recurseGetBread(userMenus: any[]) {
    for (const item of userMenus) {
      if (path.startsWith(item.url)) {
        if (item.url === path && !item.children) {
          breadcrumbs.push({
            name: item.name,
            path: item.url
          })
        } else {
          breadcrumbs.push({
            name: item.name
          })
          recurseGetBread(item.children)
        }
      }
    }
  }
  recurseGetBread(userMenus)

  return breadcrumbs
}

/**
 * 菜单映射到id的列表
 * @param menuList
 */
export function mapMenuListToIds(menuList: any[]) {
  const ids: number[] = []

  // 递归映射id，设置最底层就行，不需要外层，因为设置外层会把里层所有的东西的设置
  function recurseGetId(menus: any[]) {
    for (const item of menus) {
      if (item.children) {
        recurseGetId(item.children)
      } else {
        ids.push(item.id)
      }
    }
  }
  recurseGetId(menuList)

  return ids
}
